const express = require("express");
const router = require("./api/api1");
const app = express();


/**
 * @date 2023-07-19 09:21:18
 * 一定在路由之前注册中间件
 * 客户端发送来的请求 可以连续调用多个中间件处理
 * 执行完中间件的业务代码后 不要忘记调用next函数
 * 为了防止代码逻辑混乱 调用next 函数后不要再写额外的代码
 * 连续调用多个中间件时候 多个中间件之间 共享req 和res的对象
 * 
*/
// 多个中间件 共享数据
const mw = function (req, res, next) {
  console.log(req.url);
  // console.log(req.originalUrl);
  req.xxx = "zxcasdqwe";
  next();
};

app.use(mw);
app.use((req, res, next) => {
  console.log("我是第二个全局中间件", req.xxx);
  next();
});

// app.use 注册全局中间件
// app.use('/api',router)
// app.use(express.static('./'))
// app.use(express.static('./'))
// 包含了next 就是 中间件处理函数  没有就是 路由处理函数
app.get("/", (req, res) => {
  console.log("获取了全局中间件注入的变量 ===> ", req.xxx);
  res.send({
    code: 401,
    data: "哈哈哈哈",
  });
});

// 绑定到app示例上的中间件 为应用级中间件
// 绑定到 router 上为 路由级中间件


// 中间件可以写很多个 也可以直接写数组里 放很多个中间件函数
app.get(
  "/middle",
  (req, res, next) => {
    console.log("我是middle 局部中间件");
    next();
  },
  (req, res, next) => {
    console.log("我是middle 局部中间件 我是第二个");
    next();
  },
  (req, res) => {
    res.send("局部中间件");
  }
);

app.get("/err",(req,res)=>{
  throw new Error("=========================> 错误!")
  res.send("err")
})

app.get("/testapi", (req, res) => {
  console.log(req.params);

  res.send({
    code: 200,
    data: {
      name: "哈哈哈",
    },
    message: "响应成功",
  });
});

// 导入路由模块 在这里注册
app.use(router);

// 四个参数 错误级别中间件  错误中间件  必须注册在最后
app.use((err,req,res,next)=>{
  console.log("error 信息",err)
  res.send(  err)
 
})

app.listen(80, () => {
  console.log("runing server http://127.0.0.1:80");
});
